﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using Datos;

namespace Negocio
{
    public class Estado : Base
    {
        #region Constantes

        const string ERR_SOURCE = "Estado";

        #endregion

        #region Atributos y Propiedades

        private string _id;
        public string Id
        {
            get { return _id; }
            set { _id = value;  MarcarModificado(); }
        }

        private string _objetoNombre;
        public string ObjetoNombre
        {
            get { return _objetoNombre; }
            set { _objetoNombre = value;  MarcarModificado(); }
        }

        private string _nombre;
        public string Nombre
        {
            get { return _nombre; }
            set { _nombre = value; MarcarModificado(); }
        }

        #endregion

        #region Acceso a Datos

        protected override bool LeerDB()
        {
            bool existe = false;
            object[] parametros = { _id, _objetoNombre, null };
            IDataReader dr = DatosOleDb.DB().ObtenerDataReader("EstadoSFiltro", parametros);
            if (dr.Read())
            {
                CargarDR(dr);
                existe = true;
            }
            dr.Close();
            return existe;
        }

        protected override void InsertDB()
        {
            object[] parametros = { _id, _objetoNombre, _nombre };
            DatosOleDb.DB().TxBegin();
            try
            {
                DatosOleDb.DB().EnviarDatos("EstadoI", ref parametros);
                DatosOleDb.DB().TxCommit();
            }
            catch (System.Data.OleDb.OleDbException)
            {
                DatosOleDb.DB().TxRollback();
                DatosException ex = new DatosException("Ya existe un Estado con el id " + _id, ERR_SOURCE);
                throw ex;
            }
            catch (Exception)
            {
                DatosOleDb.DB().TxRollback();
                throw;
            }
        }
        protected override void UpdateDB()
        {
            object[] parametros = { _id, _objetoNombre, _nombre };
            DatosOleDb.DB().TxBegin();
            try
            {
                DatosOleDb.DB().EnviarDatos("EstadoU", ref parametros);
                DatosOleDb.DB().TxCommit();
            }
            catch (System.Data.SqlClient.SqlException)
            {
                DatosOleDb.DB().TxRollback();
                DatosException ex = new DatosException("Ya existe un Estado con el id " + _id, ERR_SOURCE);
                throw ex;
            }
            catch (Exception)
            {
                DatosOleDb.DB().TxRollback();
                throw;
            }
        }
        protected override void DeleteDB()
        {
            object[] parametros = { _id, _objetoNombre };
            DatosOleDb.DB().TxBegin();
            try
            {
                DatosOleDb.DB().EnviarDatos("EstadoD", ref parametros);
                DatosOleDb.DB().TxCommit();
            }
            catch (Exception)
            {
                DatosOleDb.DB().TxRollback();
                throw;
            }
        }
        
        protected override void CargarDR(IDataReader dr)
        {
            _id = dr["id"].ToString();
            _objetoNombre = dr["objetoNombre"].ToString();
            _nombre = dr["nombre"].ToString();
            MarcarViejo();
        }
        public override void Validar()
        {
            InconsistenciaException ex = new InconsistenciaException();
            ex.Source = ERR_SOURCE;
            if (_id == string.Empty) ex.AgregarError("Dato requerido", "Id");
            if (_nombre == string.Empty) ex.AgregarError("Dato requerido", "Nombre");
            ex.Lanzar(); 
        }

        #endregion

        #region Metodos estaticos de clase

        public static Estado ObtenerPorId(string id, string objetoNombre)
        {
            Estado obj = new Estado();
            obj._id = id;
            obj._objetoNombre = objetoNombre;
            if (obj.LeerDB())
            {
                return obj;
            }
            else
            {
                return null;
            }
        }

        public static List<Estado> ObtenerTodos(string objetoNombre)
        {
            Estado obj;
            List<Estado> lista = new List<Estado>();
            object[] parametros = { null, objetoNombre, null };
            IDataReader dr;
            dr = DatosOleDb.DB().ObtenerDataReader("EstadoSFiltro", parametros);
            while (dr.Read())
            {
                obj = new Estado();
                obj.CargarDR(dr);
                lista.Add(obj);
            }
            dr.Close();
            return lista;
        }

        #endregion
    }
}
